Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

441
Views
¿Por qué Firebase Query [ ] a pesar de async/await?

Todavía me cuesta entender cómo extraer valores de una consulta de Firestore y ponerlos en una variable global. Entiendo (ahora) que la naturaleza asincrónica significa que el código no se ejecuta en el orden en que se escribe. Pero, ¿por qué user aún no está definido en el siguiente bloque de código a pesar de la palabra clave await dentro de una función async ? Entiendo (según esta pregunta ) que await debe aplicarse solo hasta get() , de lo contrario, es posible que no haya valores para iterar.

Mi pregunta es similar a esta , pero me encuentro con el mismo problema que el comentario y parece que la pregunta nunca se marcó como respondida. También es similar a esto , pero presionar todo llega a una Promesa y luego resolver esa promesa aún no asignó los datos a una variable. Simplemente imprimió una matriz vacía.

Puedo imprimir la variable, por lo que creo que mi pregunta es sobre la asignación. Esta función es un controlador para un Intent en DialogFlow . Prefiero tener los datos disponibles fuera de la llamada a la base de datos. Agregar a las respuestas del agente en una llamada a firestore no siempre agrega el texto al agente, por lo que me gustaría evitar eso.

 async function loginHandler(agent){ username = agent.parameters.username.name; password = agent.parameters.password; const user = await db.collection("users") .where("name","==",username) .where("password","==",password) .limit(1) .get() .then(querySnapshot =>{ querySnapshot.forEach(docSnapShot =>{ return docSnapShot.data(); //console.log.(docSnapShot.data()); //prints correct contents, so error is in programming logic agent.add("Response"); // Would prefer to avoid this, but could refactor if I am fundamentally misunderstanding how to access Firebase data }) }) .catch(error => console.log); console.log(user); console.log("bort"); }

Imagen de Firestore para demostrar que existen los datos correctos:

ingrese la descripción de la imagen aquí

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

forEach itera los resultados pero no devuelve nada, por lo que su return dentro no está haciendo lo que esperaría ( forEach devuelve void , por lo que está devolviendo la instantánea a una función que devuelve void ). Puede crear una variable local para contener los resultados que itera y luego devolver eso:

 const user = await db.collection("users") .where("name","==",username) .where("password","==",password) .limit(1) .get() .then(querySnapshot =>{ // Set up an empty array to return later let data = [] querySnapshot.forEach(docSnapShot =>{ // Add each snapshot's data object to the array data = [...data, ...docSnapShot.data()] }) // Return `data` which will populate `user` return data }) .catch(error => console.log);
about 4 years ago · Juan Pablo Isaza Report

0

Es posible que pueda dividir el código. Primero devuelva los datos de la base de datos, luego map los datos para extraer los detalles y luego asigne ese resultado a la variable de user .

 async function loginHandler(agent) { username = agent.parameters.username.name; password = agent.parameters.password; // `await` the promise and assign it to // `querySnapshot` const querySnapshot = await db.collection('users') .where('name', '==', username) .where('password', '==', password) .limit(1) .get() .catch(error => console.log); const user = querySnapshot.docs.map(docSnapShot => { agent.add('Response'); return docSnapShot.data(); }); console.log(user); }

about 4 years ago · Juan Pablo Isaza Report

0

¿Has comprobado cuál es la respuesta correcta?

Aclare si quiere decir undefined como dice en el título o empty array como dice en el texto.

Tu código me parece correcto. No esperaría que la salida de console.log(user) no esté undefined . Sin embargo, una lista vacía [ ] sería una respuesta perfectamente razonable.

¿Quizás no hay nadie en esa colección con ese nombre de usuario y contraseña?

¿Has probado a quitar la condición de igualdad de usuario y contraseña? Eso debería darle un elemento de la colección, si no está completamente vacío.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!